package com.hkorte.elasticsearch.significance.rest;
import com.hkorte.elasticsearch.significance.SignificantTermsProvider;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.logging.ESLogger;
import org.elasticsearch.common.logging.Loggers;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContent;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.rest.*;
import org.elasticsearch.search.facet.FacetBuilder;
import org.elasticsearch.search.facet.FacetBuilders;
import org.elasticsearch.search.facet.terms.TermsFacet;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import static org.elasticsearch.rest.RestRequest.Method.GET;
import static org.elasticsearch.rest.RestRequest.Method.POST;
import static org.elasticsearch.rest.RestStatus.BAD_REQUEST;
import static org.elasticsearch.rest.RestStatus.OK;
/**
* Created by hkorte on 29.03.14.
*/
public class SignificanceShowcaseRestHandler extends BaseRestHandler {
private final ESLogger logger;
private final SignificantTermsProvider significantTermsProvider;
@Inject
public SignificanceShowcaseRestHandler(Settings settings, Client client, RestController controller) {
super(settings, client);
this.logger = Loggers.getLogger(getClass(), settings);
this.significantTermsProvider = new SignificantTermsProvider(settings, client);
controller.registerHandler(GET, "/{index}/{type}/_significance", this);
controller.registerHandler(POST, "/{index}/{type}/_significance", this);
}
@Override
public void handleRequest(final RestRequest request, final RestChannel channel) throws ExecutionException,
IOException {
String[] indices = Strings.splitStringByCommaToArray(request.param("index"));
String[] types = Strings.splitStringByCommaToArray(request.param("type"));
BytesReference data = request.content();
XContent xContent = XContentFactory.xContent(data);
XContentParser parser = xContent.createParser(data);
XContentParser.Token token;
// default values
String query = "{\"match_all\":{}}";
String field = "_all";
int size = 20;
String currentFieldName = null;
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
if (token == XContentParser.Token.FIELD_NAME) {
currentFieldName = parser.currentName();
} else if ("query".equals(currentFieldName)) {
if (token == XContentParser.Token.START_OBJECT && !parser.hasTextCharacters()) {
XContentBuilder builder = XContentBuilder.builder(parser.contentType().xContent());
builder.copyCurrentStructure(parser);
query = builder.string();
} else {
query = parser.text();
}
} else if ("size".equals(currentFieldName)) {
size = parser.intValue();
} else if ("field".equals(currentFieldName)) {
field = parser.text();
}
}
this.significantTermsProvider.writeSignificantTerms(channel, indices, types, field, size, query);
}
}